# -*- coding: utf-8 -*-
"""
DTM验证工具 - 主入口文件
提供命令行和GUI两种使用方式
"""

import sys
import os
import argparse
from typing import List, Dict, Any


def setup_path():
    """设置模块搜索路径"""
    current_dir = os.path.dirname(os.path.abspath(__file__))
    if current_dir not in sys.path:
        sys.path.insert(0, current_dir)


def run_gui_mode():
    """运行GUI模式"""
    try:
        from gui_application import create_and_run_gui

        print("启动图形界面...")
        create_and_run_gui()
    except ImportError as e:
        print(f"无法启动图形界面: {e}")
        print("请确保已安装所需的依赖包")
        sys.exit(1)
    except Exception as e:
        print(f"图形界面运行时发生错误: {e}")
        sys.exit(1)


def run_command_line_mode(args):
    """运行命令行模式"""
    try:
        from dtm_controller import DTMBatchProcessor

        # 解析输入配置
        input_configs = []

        if args.config_file:
            # 从配置文件读取
            input_configs = load_config_from_file(args.config_file)
        elif args.input_dir:
            # 从输入目录扫描
            input_configs = scan_input_directory(
                args.input_dir, args.height, args.recursive
            )
        elif args.files:
            # 从指定文件列表
            input_configs = [
                {"file_path": file_path, "fixed_height": args.height}
                for file_path in args.files
            ]
        else:
            print("错误: 请指定输入文件、目录或配置文件")
            sys.exit(1)

        if not input_configs:
            print("没有找到要处理的文件")
            sys.exit(1)

        # 创建批量处理器并运行
        processor = DTMBatchProcessor(input_configs)
        result = processor.run_batch_processing()

        # 退出状态
        sys.exit(0 if result["success"] else 1)

    except ImportError as e:
        print(f"无法运行命令行模式: {e}")
        print("请确保所有模块文件存在且依赖包已安装")
        sys.exit(1)
    except Exception as e:
        print(f"命令行模式运行时发生错误: {e}")
        sys.exit(1)


def load_config_from_file(config_file: str) -> List[Dict[str, Any]]:
    """从配置文件加载文件配置"""
    import json

    try:
        with open(config_file, "r", encoding="utf-8") as f:
            config_data = json.load(f)

        input_configs = []
        for file_config in config_data.get("files", []):
            if os.path.exists(file_config["file_path"]):
                input_configs.append(
                    {
                        "file_path": file_config["file_path"],
                        "fixed_height": file_config["fixed_height"],
                    }
                )
            else:
                print(f"警告: 配置文件中的文件不存在: {file_config['file_path']}")

        return input_configs

    except Exception as e:
        print(f"读取配置文件失败: {e}")
        return []


def scan_input_directory(
    input_dir: str, default_height: float, recursive: bool
) -> List[Dict[str, Any]]:
    """扫描输入目录获取Excel文件"""
    try:
        from file_manager import DirectoryScanner

        scanner = DirectoryScanner()
        excel_files = scanner.scan_directory_for_excel_files(input_dir, recursive)

        return [
            {"file_path": file_path, "fixed_height": default_height}
            for file_path in excel_files
        ]

    except Exception as e:
        print(f"扫描输入目录失败: {e}")
        return []


def validate_arguments(args):
    """验证命令行参数"""
    if args.mode == "cli":
        if not any([args.files, args.input_dir, args.config_file]):
            print(
                "错误: 命令行模式需要指定输入文件 (--files)、目录 (--input-dir) 或配置文件 (--config)"
            )
            return False

        if args.files:
            for file_path in args.files:
                if not os.path.exists(file_path):
                    print(f"错误: 文件不存在: {file_path}")
                    return False

        if args.input_dir and not os.path.exists(args.input_dir):
            print(f"错误: 输入目录不存在: {args.input_dir}")
            return False

        if args.config_file and not os.path.exists(args.config_file):
            print(f"错误: 配置文件不存在: {args.config_file}")
            return False

    return True


def create_sample_config():
    """创建示例配置文件"""
    sample_config = {
        "files": [
            {"file_path": "input/sample1.xlsx", "fixed_height": 11.49},
            {"file_path": "input/sample2.xlsx", "fixed_height": 11.57},
        ],
        "export_time": "2024-01-01T00:00:00",
        "project_config": {
            "output_dir": "output",
            "figure_dpi": 300,
            "figure_size": [12, 8],
        },
    }

    import json

    config_path = "sample_config.json"

    try:
        with open(config_path, "w", encoding="utf-8") as f:
            json.dump(sample_config, f, indent=2, ensure_ascii=False)
        print(f"示例配置文件已创建: {config_path}")
    except Exception as e:
        print(f"创建示例配置文件失败: {e}")


def print_version_info():
    """打印版本信息"""
    version_info = """
DTM验证工具 v2.0
====================================

主要功能:
• 批量处理Excel格式的DTM数据
• 自动三角剖分和体积计算  
• 三维可视化和报告生成
• 支持GUI和命令行两种模式

技术栈:
• Python 3.7+
• Pandas, NumPy, Matplotlib, SciPy
• Tkinter (GUI)
• 模块化架构设计

作者: DTM验证工具开发团队
"""
    print(version_info)


def main():
    """主函数"""
    # 设置模块路径
    setup_path()

    # 创建参数解析器
    parser = argparse.ArgumentParser(
        description="DTM验证工具 - 地形三角网数据批量验证与分析",
        formatter_class=argparse.RawDescriptionHelpFormatter,
        epilog="""
使用示例:
  # 启动图形界面 (默认)
  python main.py
  
  # 命令行模式 - 处理指定文件
  python main.py cli --files file1.xlsx file2.xlsx --height 10.0
  
  # 命令行模式 - 处理整个目录
  python main.py cli --input-dir ./input --height 11.5 --recursive
  
  # 命令行模式 - 使用配置文件
  python main.py cli --config config.json
  
  # 创建示例配置文件
  python main.py --create-config
  
  # 显示版本信息
  python main.py --version
        """,
    )

    # 添加子命令
    subparsers = parser.add_subparsers(dest="mode", help="运行模式")

    # GUI模式 (默认)
    gui_parser = subparsers.add_parser("gui", help="图形界面模式")

    # 命令行模式
    cli_parser = subparsers.add_parser("cli", help="命令行模式")

    # 命令行模式参数
    input_group = cli_parser.add_mutually_exclusive_group(required=True)
    input_group.add_argument("--files", nargs="+", help="要处理的Excel文件列表")
    input_group.add_argument("--input-dir", help="包含Excel文件的输入目录")
    input_group.add_argument("--config", dest="config_file", help="配置文件路径")

    cli_parser.add_argument(
        "--height", type=float, default=10.0, help="默认基准高程 (默认: 10.0)"
    )
    cli_parser.add_argument(
        "--recursive",
        action="store_true",
        help="递归扫描子目录 (仅与 --input-dir 一起使用)",
    )
    cli_parser.add_argument("--output-dir", help="输出目录 (可选)")

    # 全局选项
    parser.add_argument("--version", action="store_true", help="显示版本信息")
    parser.add_argument("--create-config", action="store_true", help="创建示例配置文件")

    # 解析参数
    args = parser.parse_args()

    # 处理全局选项
    if args.version:
        print_version_info()
        return

    if args.create_config:
        create_sample_config()
        return

    # 如果没有指定模式，默认使用GUI
    if args.mode is None:
        args.mode = "gui"

    # 验证参数
    if not validate_arguments(args):
        sys.exit(1)

    # 根据模式运行
    try:
        if args.mode == "gui":
            run_gui_mode()
        elif args.mode == "cli":
            run_command_line_mode(args)
        else:
            print(f"未知的运行模式: {args.mode}")
            sys.exit(1)

    except KeyboardInterrupt:
        print("\n程序被用户中断")
        sys.exit(0)
    except Exception as e:
        print(f"程序运行时发生未预期的错误: {e}")
        import traceback

        traceback.print_exc()
        sys.exit(1)


if __name__ == "__main__":
    main()
